home *** CD-ROM | disk | FTP | other *** search
Modula Definition | 1989-10-08 | 3.8 KB | 105 lines |
- DEFINITION MODULE Compressions;
-
- FROM SYSTEM IMPORT ADDRESS;
-
-
- CONST DestOverhead = 6L;
- (*
- * Um soviel Bytes sollte der Kodierungs-Puffer größer als der
- * Ausgangspuffer sein, damit die Komprimierung nicht fehlschlagen
- * kann.
- *)
-
- PROCEDURE Encode ( type: CARDINAL;
- source: ADDRESS;
- sourceLen: LONGCARD;
- dest: ADDRESS;
- destLen: LONGCARD;
- VAR codeLen: LONGCARD );
- (*
- * Komprimiert beliebige Daten
- *
- * Eingabe:
- * 'type': Bei Null wird die optimale Komprimierung ausgesucht (bisher
- * nur LZW), ist sie Eins, wird eine Lempel-Ziv-Welch-Kodierung
- * vorgenommen, sonst wird wie bei Null vorgegangen.
- * 'source': Adresse der Originaldaten
- * 'sourceLen': Länge der Originaldaten
- * 'dest': Zieladresse für komprimierte Daten
- * 'destLen': Länge des Puffers für komprimierte Daten, muß um Sechs
- * größer sein, damit Komprimierung IMMER erfolgreich ist.
- * Bei der Kodierung wird keinesfalls über diesen Puffer
- * hinausgeschrieben.
- * Rückgabe:
- * 'codeLen': Länge der komprimierten Daten, egal, ob sie in den Puffer
- * passen oder nicht. Ist 'codeLen' Null oder größer als
- * 'destLen', sind die Daten im dest-Puffer nicht gültig.
- * Dies kann nur passieren, wenn 'destLen' nicht um Sechs
- * größer als 'sourceLen' ist.
- *
- * Sonderfall:
- * Ist 'dest' NIL oder 'destLen' Null, wird keine Komprimierung
- * vorgenommen, 'codeLen' enthält dann trotzdem die theoritische
- * Länge der komprimierten Daten.
- *
- * Ist die Komprimierung erfolgreich, werden im komprimierten Code
- * die Informationen über dessen Komprimierungsart und Originallänge
- * abgelegt.
- *)
-
- PROCEDURE GetInfo ( code: ADDRESS;
- VAR type: CARDINAL;
- VAR length: LONGCARD );
- (*
- * Eingabe:
- * 'source': Puffer der mit 'Encode' kodierten Daten.
- * Rückgabe:
- * 'type': 0 -> nicht komprimiert
- * 1 -> Lempel-Ziv-Welch-Kodierung
- * 'length': Originallänge
- *)
-
- PROCEDURE Decode ( code: ADDRESS;
- codeLen: LONGCARD;
- orig: ADDRESS;
- origLen: LONGCARD;
- VAR success: BOOLEAN );
- (*
- * Dekomprimiert die Daten wieder.
- * Es muß noch mind. 8 KB Speicher frei sein!
- *
- * Eingabe:
- * 'code': Adresse der kodierten Daten
- * 'codeLen': Länge der kodierten Daten
- * 'orig': Zieladresse für Originaldaten
- * 'origLen': Vermeintliche Länge der Originaldaten
- * (kann von 'sourceLen'-Parameter bei 'Encode' übernommen
- * oder über 'GetInfo' ermittelt werden).
- * Rückgabe:
- * 'success': Wenn 'origLen' nicht mit der internen Information
- * übereinstimmt oder wenn ein unbekannter Koprimierungs-
- * algorithmus verwendet wurde, liefert 'success' FALSE,
- * sonst TRUE.
- *)
-
- (*
- * Beispiel:
- *
- * (* Zuerst die Daten komprimieren *)
- * (* 'data' zeigt auf die Daten im Speicher, 'len' ist ihre Länge *)
- * destLen:= len + DestOverhead;
- * ALLOCATE (destData, destLen);
- * Encode (0, data, len, destData, destLen, codeLen);
- * (* Hierbei kann kein Fehler aufgetreten sein *)
- * (* Der Code ist nun 'codeLen' Bytes lang *)
- *
- * Der Code kann abgespeichert werden...
- *
- * (* Nun wieder dekomprimieren *)
- * GetInfo (destData, len);
- * Decode (destData, destLen, data, len, ok);
- * IF NOT ok THEN Fehler END;
- *)
-
- END Compressions.
-